package cn.com.doone.common.uc.domain.oauth;

import java.util.List;
import java.util.Map;

import cn.com.doone.common.uc.domain.shared.Repository;
import cn.com.doone.common.uc.service.dto.IpBlackList;
import cn.com.doone.common.uc.service.dto.LoginLog;

/**
 * 15-6-13
 *
 * @author Shengzhao Li
 */
public interface OauthRepository extends Repository {
	
    ClientDetails findClientDetails(String clientId);

    int saveClientDetails(ClientDetails clientDetails);

    int saveOauthCode(OauthCode oauthCode);

    OauthCode findOauthCode(String code, String clientId);

    OauthCode findOauthCodeByUsernameClientId(String username, String clientId);

    int deleteOauthCode(OauthCode oauthCode);

    AccessToken findAccessToken(String clientId, String username, String authenticationId);

    int deleteAccessToken(AccessToken accessToken);

    int saveAccessToken(AccessToken accessToken);

    AccessToken findAccessTokenByRefreshToken(String refreshToken, String clientId);
    
    /**
     * 根据应用标识获取应用信息
     * 
     * @author whm
     * @param appCode
     * @return
     */
    Map<String, Object> findAppInfo(String appCode);
    
    /**
     * 根据用户账号获取用户信息
     * 
     * @author whm
     * @param userAccount
     * @return
     */
    Map<String, Object> findUserInfoByUserAccount(String userAccount);
    
    /**
     * 根据用户ID获取用户信息
     * @param userId
     * @return
     */
    Map<String,Object> findUserInfoByUserId(String userId);
    
    /**
	 * 根据用户组id,应用id获取组授权应用数据
	 * 
	 * @author whm
	 * @param userGroupId
	 * @param appInfoId
	 * @return
	 */
	Map<String, Object> findUserGroupAppAuthorize(int userGroupId, int appInfoId);
	
	/**
	 * 根据用户id,应用id验证所属用户组是否授权应用
	 * 
	 * @author whm
	 * @param userId
	 * @return true-授权 false-未授权
	 */
	boolean valiUserGroupAndAppAuthorize(int userId, int appInfoId);
	
	/**
	 * 根据用户id,应用id验证用户是否授权应用
	 * 
	 * @author whm
	 * @param userId
	 * @param appInfoId
	 * @return true-授权 false-未授权
	 */
	boolean valiUserAndAppAuthorize(int userId, int appInfoId);
	
	/**
	 * 验证传入IP是否存在于IP黑名单中(在失效时间以内)
	 * 
	 * @author whm
	 * @param ip
	 * @return true-是 false-否
	 */
	boolean valiIPBlackList(String ip);
	
	/**
	 * 保存ip至黑名单
	 * 
	 * @author whm
	 * @param ip			IP
	 * @param invalidTime 	失效时间
	 * @param remarks		备注
	 */
	void saveIPBlackListInfo(IpBlackList ipBlackList);
	
	/**
	 * 删除ip黑名单数据
	 * 
	 * @author whm
	 * @param ip
	 */
	void deleteIPBlackListInfo(String ip);
	
	/**
	 * 根据IP更新ip黑名单数据
	 * 
	 * @author whm
	 * @param ip			
	 * @param invalidTime	失效时间
	 * @param remarks		备注
	 */
	void updateIPBlackListInfoByIP(String ip, String invalidTime, String remarks);
	
	/**
	 * 根据ID更新ip黑名单数据
	 * 
	 * @author whm
	 * @param id
	 * @param ip
	 * @param invalidTime	失效时间
	 * @param remarks		备注
	 */
	void updateIPBlackListInfoByID(int id, String ip, String invalidTime, String remarks);
	
	/**
	 * 验证IP是否存在于黑名单(where条件只有ip)
	 * 
	 * @author whm
	 * @param ip
	 * @return true-存在 false-不存在
	 */
	boolean valiIPExitBlackList(String ip);
	
	/**
	 * 验证ip是否存在白名单
	 * 
	 * @author whm
	 * @param ip
	 * @return true-存在 false-不存在
	 */
	boolean valiIPWhiteList(String ip);
	
	/**
	 * 查询ip黑名单数据
	 * 
	 * @author whm
	 * @param searchWhere
	 * @return
	 */
	List<Map<String, Object>> findIPBlackList(String searchWhere);
	
	/**
	 * 查询ip白名单数据
	 * 
	 * @author whm
	 * @param searchWhere
	 * @return
	 */
	List<Map<String, Object>> findIPWhiteList(String searchWhere);
	
	/**
	 * 删除用户授权应用信息
	 * 
	 * @author whm
	 * @param userId
	 * @param appinfoId
	 */
    void deleteUserAppAuthorize(int userId, int appInfoId);
    
    /**
	 * 保存组授权应用信息
	 * 
	 * @author whm
	 * @param userId
	 * @param appinfoId
	 */
	void saveGroupAppAuthorize(int userGroupId, int appInfoId);
    
	/**
	 * 保存用户授权应用信息
	 * 
	 * @author whm
	 * @param userId
	 * @param appinfoId
	 */
	void saveUserAppAuthorize(int userId, int appInfoId);
	
	/**
	 * 弱密码验证
	 * 
	 * @param password
	 * @return
	 */
	public boolean validWeakPassword(String password);
	
	/**
	 * 旧密码是否正确
	 * 
	 * @param password
	 * @return
	 */
	public boolean isCorrectPassword(String userAccount, String password);
	
	/**
	 * 根据userinfoid判断旧密码是否正确
	 * @param userInfoId
	 * @param password
	 * @return
	 */
	public boolean isCorrectPasswordByUserInfoId(String userInfoId,String password);
	
	/**
	 * 修改密码
	 * 
	 * @param userAccount
	 * @param password
	 * @return
	 */
	public void changePassword(String userAccount, String password,String p_code);
	
	/**
	 * 通过userInfoId修改密码
	 * @param userInfoId
	 * @param password
	 * @param p_code
	 */
	public void changePasswordByUserInfoId(String userInfoId,String password,String p_code);
	
	/**
	 * 登录日志
	 *  
	 * @param loginLog
	 */
	public void saveLoginLog(LoginLog loginLog);
	
	/**
	 * 根据账号查ID
	 * 
	 * @param userAccount
	 * @return
	 */
	public int findUserInfoIdByAccount(String userAccount);
	
	/**
	 * 统计某个时间段某IP登录失败的次数
	 * 
	 * @param ip
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public int countLoginLogByIp(String ip, String startTime, String endTime);
	
	/**
	 * 统计某个时间段某账号登录失败的次数
	 * 
	 * @param userAccount
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public int countLoginLogByUserId(int userInfoId, String startTime, String endTime);

	boolean valiIPExist(String ip);
	
	/**
	 * 更新账号的锁定状态
	 * 
	 * @param userMap
	 */
	public void updateUserLock(Map<String, Object> userMap);
	
	/**
	 * 
	 * @param appCode
	 * @param userAccount
	 * @return
	 */
	public Map<String, Object> findUserInfoByUserAccount(String appCode, String userAccount);
	
	/**
	 * 根据账号获取用户信息 简单
	 * 
	 * @param userAccount
	 * @return
	 */
	public Map<String, Object> findUserInfoByUserAccountSimple(String userAccount);
	
	/**
	 * 根据第三方应用账号，查看用户中心账号
	 * 
	 * @param appCode
	 * @param appAccount
	 * @return
	 */
	public Map<String, Object> findUserInfoByAppAccount(String appCode, String appAccount);
	
	public Map<String, Object> findWedoStaffIdByAccount(String appCode, String userAccount);
	
	public void saveAccountBinding(Map<String, Object> userMap);
	
	public Map<String, Object> findAppInfoByWeChatId(String clientId, String appid);
	
	 /**
     * 根据client_id获取用户绑定信息
     * 
     * @param clientId
     * @param appCode
     * @return
     */
    public List<Map<String, Object>> findWechatIdList(String clientId, String appCode);
    
    /**
     * 根据用户ID获取第三方应用ID
     * 
     * @param userInfoId
     * @param appCode
     * @return
     */
    public Map<String, Object> findWechatIdByUserInfoId(int userInfoId, String appCode);
    
    /**
     * 查看用户所在的组
     * 
     * @param userInfoId
     * @return
     */
    public List<Integer> findUserGroupByUserId(int userInfoId);
    
    /**
     * 查看组授权应用数量
     * 
     * @param userGroupId
     * @param appInfoId
     * @return
     */
    public int countUserGroupAndAppAuthorize(int userGroupId, int appInfoId);
    
    /**
     * 根据token获取信息
     * @param token
     * @return
     */
	public Map<String,Object> queryInfoByToken(String token);
}
